MyBatis是由iBatis 3.x更名而來,iBatis原先屬於apache software foundation,於2010年轉移到了google code,因此ibatis3.x正式改名為Mybatis
。
有些人說MyBatis是ORM框架中的一種,而有些人則說不是,那ORM是什麼?ORM
全名為Object Relational Mapping
,實際上只是一種概念,也就是將Java物件的型別與關聯式資料庫(RDBMS)的型別做映射,這種映射關係的概念,就是所謂的ORM。
那為什麼MyBatis會有人認為他是ORM框架,有人認為不是呢?主要原因在於ORM的概念是透過建立物件與資料表之間映射關係,使開發人員在開發程式時,不需撰寫SQL,以此減少對資料庫基本操作的程式開發,並避免SQL上的惡意注入攻擊。而MyBatis最特別的部分就是在這裡了,我們可以建立Java物件與資料庫的映射關係,也可以自行撰寫SQL。
相信所有寫程式的人都知道介面的用途,而MyBatis就是將Dao(Data Access Object)
相關方法定義為介面Mapper
,再透過XML
來實作,實際做法如下:
XML
中設置namespace
,定義此XML是實作哪一個Mapper interface<mapper namespace="com.twm.opbiz.dao.CountyVOMapper"></mapper>
XML
中使用<select>
、<insert>
、<update>
、<delete>
的id
來對應實作介面Mapper
中的哪個方法public interface CountyVOMapper {
int deleteByPrimaryKey(String countyId);
int insert(CountyVO record);
int insertSelective(CountyVO record);
CountyVO selectByPrimaryKey(String countyId);
List<CountyVO> selectAll();
int updateByPrimaryKeySelective(CountyVO record);
int updateByPrimaryKey(CountyVO record);
}
<delete id="deleteByPrimaryKey" parameterType="java.lang.String"></delete>
<insert id="insert" parameterType="com.twm.opbiz.vo.CountyVO"></insert>
<insert id="insertSelective" parameterType="com.twm.opbiz.vo.CountyVO"></insert>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap"></select>
<select id="selectAll" resultMap="BaseResultMap"></select>
<update id="updateByPrimaryKeySelective" parameterType="com.twm.opbiz.vo.CountyVO"></update>
<update id="updateByPrimaryKey" parameterType="com.twm.opbiz.vo.CountyVO"></update>
<resultMap>
自行建立物件與資料表之間映射關係<resultMap id="BaseResultMap" type="com.twm.opbiz.vo.CountyVO">
<id column="county_id" jdbcType="VARCHAR" property="countyId" />
<result column="county_name" jdbcType="VARCHAR" property="countyName" />
<result column="county_code" jdbcType="VARCHAR" property="countyCode" />
<result column="cr_date" jdbcType="TIMESTAMP" property="crDate" />
<result column="cr_user" jdbcType="VARCHAR" property="crUser" />
<result column="datestamp" jdbcType="TIMESTAMP" property="datestamp" />
<result column="userstamp" jdbcType="VARCHAR" property="userstamp" />
</resultMap>
parameterType
設定參數型態,也可將重複性高的SQL以<sql>
獨立設置,供後續SQL直接引用,減少相同程式碼的撰寫<sql id="Base_Column_List">
county_id, county_name, county_code, cr_date, cr_user, datestamp, userstamp
</sql>
<select id="selectAll" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from opbiz.tb_county
order by county_code, county_id
</select>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from opbiz.tb_county
where county_id = #{countyId,jdbcType=VARCHAR}
</select>
綜上所述,我們可以知道MyBatis在應用上有較多的彈性,傳統ORM的框架在處理多個表格JOIN、或是較為複雜的查詢時,比起直接下SQL語句,在處理上是較為麻煩及繁瑣的。因此我們專案選擇了MyBatis而非標準的ORM框架,使其在專案上的應用能更有彈性,只是需要特別注意的是,自行撰寫的SQL語法是否會受到惡意注入攻擊。